package com.mastercard.assets.web.util.to;

import java.util.ArrayList;
import java.util.List;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAssetSolRespuesta;
import com.mastercard.assets.jpa.TblAssetSolicitud;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblTipoCuentaPaquete;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;

public class ManejadorPaquetesAutorizar
{
	private int cveTipoCuenta ;

	private TblTipoCuenta countType ;
	
	private TblCuenta count ;
	private int cveCuenta ;
	
	private List< TblAssetSolRespuesta > respuestasDadas = new ArrayList< TblAssetSolRespuesta >( ) ;
	
	// lista de cuentas hermanas
	private List< TblCuenta > bindCounts = new ArrayList< TblCuenta >( ) ;
	private List< PaqueteAutorizar > paqueteAutorizarLista = new ArrayList< PaqueteAutorizar >( ) ;
	
	public List<PaqueteAutorizar> getPaqueteAutorizarLista() {
		return paqueteAutorizarLista;
	}

	public List<TblCuenta> getBindCounts() {
		return bindCounts;
	}

	public void setBindCounts(List<TblCuenta> bindCounts) {
		// en caso de que sea null
		if( bindCounts == null )
			return ;
		
		// en caso de que no sea null
		this.bindCounts = bindCounts ;
	}

	public int getCveCuenta() {
		return cveCuenta;
	}

	public void setCveCuenta(int cveCuenta) {
		this.cveCuenta = cveCuenta;
	}

	public TblCuenta getCount() {
		return count;
	}

	public void setCount(TblCuenta count) {
		this.count = count;
	}

	public TblTipoCuenta getCountType() {
		return countType;
	}

	public int getCveTipoCuenta() {
		return cveTipoCuenta;
	}

	public void setCveTipoCuenta(int cveTipoCuenta) {
		this.cveTipoCuenta = cveTipoCuenta;
	}

	public void initialize( )
		throws
			MasterCardException
	{
		// en caso de 0 o menos
		if( cveTipoCuenta < 1 )
		{
			throw new MasterCardException( 
						MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.NoCountTypeOnInitialize" ) , 
						MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_NOT_EXITS , 
						null ) ;
		}
		
		// trae el tipo de cuenta
		countType = MasterCardDAO.findCountTypeById( cveTipoCuenta ) ;
//		MasterCardDAO.closeEntityManager( ) ;
		// en caso de null
		if( countType == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.tipocuenta.solicitarpaquetes.CountTypeIdNotExist" , cveTipoCuenta ) , 
					MCUtil.MASTERCARD_ERROR_CODE_COUNTTYPE_PACKAGEREQUEST_COUNTTYPE_ID_NOT_EXITS , 
					null ) ;
		
//		System.out.println( "ManejadorPaqueteAutorizar.java:initialize> Numero de cuenta: " + cveCuenta ) ;
//		
		// en caso de 0 o menos
		if( cveCuenta > 0 )
		{
			// trae el tipo de cuenta
			count = MasterCardDAO.findCountById( cveCuenta ) ;
//                        MasterCardDAO.closeEntityManager( ) ;
//			System.out.println( "ManejadorPaqueteAutorizar.java:initialize> Nombre de cuenta: " + count.getNombre( ) ) ;
//			
//			
//			System.out.println( "ManejadorPaquetesAutorizar.java: Cuenta/" + count.getNombre( ) ) ;
//			
			// asigna las respuestas
			respuestasDadas = count.getTblAssetSolRespuestas( ) ;
			
//			System.out.println( "ManejadorPaquetesAutorizar.java: Respuestas/" + respuestasDadas ) ;
//			
			// en caos dee que sea null
			if( respuestasDadas == null )
				respuestasDadas = new ArrayList< TblAssetSolRespuesta >( ) ;
		}
		
		// en caso de que no haya cuentas hermanas
		if( bindCounts == null || bindCounts.size( ) == 0 )
			// regresa
			return ;
		
		// recorre las cuentas hermanas
		for( TblCuenta cuenta : bindCounts )
		{
//			System.out.println( "ManejadorPaquetesAutorizar.java: Cuenta Hermana/" + cuenta.getNombre( ) ) ;
//			
			// toma las solicitudes de la cuenta recorrida
			List< TblAssetSolicitud > solicitudesCuenta = cuenta.getTblAssetSolicituds( ) ;
			
			// puede tener varias solicitudes
			// recorre las solicitudes de la cuenta
			for( TblAssetSolicitud solicitud : solicitudesCuenta )
			{
//				System.out.println( "ManejadorPaquetesAutorizar.java: TblAssetSolicitud/" + solicitud.getCveSolicitud( ) + " - " + solicitud.getBandera( ) ) ;
//				
				// en caso de que no sea por autorizar
				if( solicitud.getBandera( ) != 1 )
					// continua al siguiente
					continue ;
				
//				System.out.println( "ManejadorPaquetesAutorizar.java: respuestas/" + respuestasDadas.size( ) ) ;
//				
				// verificamos las respuestas de la cuenta actual para ver si coinciden con la solicitud recorrida
				
				// bandera para verificar si ya existe respuesta
				boolean existeRespuesta = false ;
				
				TblAssetSolRespuesta respuestaExistente = null ;
				
				// recorremos las respuestas
				for( TblAssetSolRespuesta resp : respuestasDadas )
				{
//					System.out.println( "ManejadorPaquetesAutorizar.java: comparacion solicitudes/" + resp.getTblAssetSolicitud( ).getCveSolicitud( ) + " - " + solicitud.getCveSolicitud( ) ) ;
//					
					// verifica que sea la misma solicitud
					// en caso de que sea la misma solicitud
					if( resp.getTblAssetSolicitud( ).getCveSolicitud( ) == solicitud.getCveSolicitud( ) )
					{
						// cambia bandera
						existeRespuesta = true ;
						
						// guarda la respuesta
						respuestaExistente = resp ;
						
						// rompe ciclo
						break ;
					}
				}// fin del recorrido de respuestas
				
//				System.out.println( "ManejadorPaquetesAutorizar.java: existe respuesta/" + existeRespuesta ) ;
//				
				// en caso que se que ya exista respuesta
				if( existeRespuesta )
				{
					// siguiente ciclo
					continue ;
				}
				
				PaqueteAutorizar paqAut = null ;
				
//				System.out.println( "ManejadorPaquetesAutorizar.java: recorre paquetesautorizar existentes" ) ;
//				
				// recorre los PaqueteAutorizar existentes
				for( PaqueteAutorizar pAut : this.paqueteAutorizarLista )
				{
//					System.out.println( "ManejadorPaquetesAutorizar.java: Paquete a Autorizar/" + pAut.verifyPackage( solicitud ) ) ;
//					
					// verifica el paquete
					boolean b = pAut.verifyPackage( solicitud ) ;
					
					// en caos de que coincida
					if( b )
					{
						// asigna paquete 
						paqAut = pAut ;
						
						// quiebra el ciclo for
						break ;
					}
				}// cierra el ciclo for
				
				// en caso de que sea null
				if( paqAut == null )
				{
					// crea uno nuevo
					paqAut = new PaqueteAutorizar( 
							solicitud , 
							bindCounts ) ;
					
					// agrega al arreglo
					this.paqueteAutorizarLista.add( paqAut ) ;
				}
				
				// agrega al paqAut
				paqAut.addSolicitud( solicitud ) ;
			}// termina for de solicitudes
		}// termina for de cuentas
		
	}// termina el metodo de inicializacion
	
	public int getQuantityOfPackageToAuthorize( )
	{
		// resultado
		int res = 0 ;
		
		// recorre los paqueteAutorizar
		for( PaqueteAutorizar paqAut : paqueteAutorizarLista )
		{
			// de cada uno pide los paquetes a autorizar y suma
			res = res + paqAut.getQuantityOfPackageToAuthorize( ) ;
		}
		
		
		// regrea resultado
		return res ;
	}
	
	public int getQuantityOfPackageToAuthorizeFromCount( int cveCuenta )
	{
		// resultado
		int res = 0 ;
		for( PaqueteAutorizar paqAut : paqueteAutorizarLista )
		{
			res += paqAut.getQuantityOfPackageToAuthorizeFromCount( cveCuenta ) ;
		}
		
		// regresa resultado
		return res ;
	}
	
	public int getNumberOfPackage( )
	{
		if( this.paqueteAutorizarLista == null )
			return 0 ;
		
		return paqueteAutorizarLista.size( ) ;
	}
	
	public int getNumberOfBindCounts( )
	{
		if( this.bindCounts == null )
			return 0 ;
		
		return bindCounts.size( ) ;
	}
}




